/*
 * Persona.h
 *
 *  Created on: Nov 8, 2012
 *      Author: Carlos Alegría
 */

#ifndef PERSONA_H_
#define PERSONA_H_

#include <string>
#include <iostream>

using namespace std;

namespace poo
{

  /**
   * Modelado de una persona
   */
  class Persona
  {

    friend ostream &
    operator<<(ostream &, const Persona *);

  public:

    /**
     * Crea una persona con los parámetros especificados
     *
     * @param [in] nombreCompleto       El nombre completo de la Persona
     * @param [in] dirección            La dirección de la Persona
     * @param [in] edad                 La edad de la Persona
     */
    Persona(const string &nombreCompleto, const string &direccion, int edad);

    /**
     *
     */
    virtual
    ~Persona();

    /**
     * Obtiene la dirección de esta Persona
     *
     * @returns Una cadena con la dirección de esta Persona
     */
    inline const string&
    getDireccion() const
    {
      return direccion;
    }

    /**
     * Establece la dirección de esta Persona
     *
     * Si la dirección es una cadena vacía, es ignorada
     *
     * @param [in] direccion    La dirección que será establecida para esta
     *                          Persona
     */
    inline void
    setDireccion(const string& direccion)
    {
      if (!direccion.empty())
        {
          this->direccion = direccion;
        }
    }

    /**
     * Obtiene la edad de esta Persona
     *
     * @returns La edad de esta persona
     */
    inline int
    getEdad() const
    {
      return edad;
    }

    /**
     * Establece la edad de esta Persona
     *
     * Si la edad es menor que 0 o mayor que 120, es ignorada
     *
     * @param [in] edad La edad que será establecida para esta persona
     */
    inline void
    setEdad(int edad)
    {
      if (edad > 0 && edad <= 120)
        {
          this->edad = edad;
        }
    }

    /**
     * Obtiene el nombre completo de esta Persona
     *
     * @returns El nombre completo de esta Persona
     */
    inline const string&
    getNombreCompleto() const
    {
      return nombreCompleto;
    }

    /**
     * Establece el nombre completo de esta persona
     *
     * Si el nombre es una cadena vacía, es ignorado
     *
     * @param [in] nombreCompleto       El nombre completo que será establecido
     *                                  para esta persona
     */
    inline void
    setNombreCompleto(const string& nombreCompleto)
    {
      if (!nombreCompleto.empty())
        {
          this->nombreCompleto = nombreCompleto;
        }
    }

  private:
    string nombreCompleto; /**< El nombre completo de esta Persona */
    string direccion; /**< La dirección de esta Persona */
    int edad; /**< La edad de esta Persona */
  };

} /* namespace poo */
#endif /* PERSONA_H_ */
